home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / trueSpace 7.6 / tS761B8Std.exe / {app} / Scripts / D3D / RsD3DMaterialFromME2_Template_Fallback.fx < prev    next >
Text File  |  2008-06-10  |  45KB  |  1,504 lines

  1. #define RSD3D_FALLBACKMODE
  2.  
  3. #include "RsD3DMaterialFromME2_BaseInclude.fx"
  4.  
  5. //----------------------------------------------------------------------
  6. //Fallback (vanilla ps2.0, ps1.4, ps1.1 and fixed pipeline) emulation
  7. //
  8. //Author - Michal Valient
  9. //Copyright (C) 2004-2008 Caligari corporation
  10. //
  11. //----------------------------------------------------------------------
  12.  
  13.  
  14.  
  15. //------------------------------
  16. //Fallback parameters start here
  17. //------------------------------
  18.  
  19. //Global parameters
  20. uniform float RsD3DMaterialFromME_fNormalMod = 1.0f;
  21. uniform float RsD3DMaterialFromME_fOpacity = 1.0f;
  22.  
  23. uniform float4 RsD3DMaterialFromME_cOverlayMod = { 0.0f, 0.0f, 0.0f, 1.0f };
  24.  
  25. //Diffuse color parameters
  26. //Final diffuse color is computed using this equation
  27. //DiffuseColor = VertexColor * RsFALL_VertexColorStrength + RsFALL_DiffuseColor + RsFALL_DiffuseMapStrength * RsFALL_DiffuseMap
  28. texture RsFALL_DiffuseMap : DIFFUSEMAP;
  29. float4  RsFALL_DiffuseColor : DIFFUSECOLOR = float4(0.0f, 0.0f, 0.0f, 0.0f);
  30. float   RsFALL_DiffuseMapStrength : DIFFUSEMAPSTRENGTH = 0.0f;
  31. float   RsFALL_VertexColorStrength : VERTEXCOLORSTRENGTH = 1.0f;
  32.  
  33. texture RsFALL_NormalMap : NORMALMAP;
  34. float4  RsFALL_SpecularColor : SPECULARCOLOR = float4(1.0f, 1.0f, 1.0f, 1.0f);
  35. float   RsFALL_Shininess : SHININESS = 30.0f;
  36. float   RsFALL_SpecularStrength : SPECULARSTRENGTH = 0.0f;
  37. float   RsFALL_DiffuseStrength : DIFFUSESTRENGTH = 1.0f;
  38.  
  39. //------------------------------
  40. //Texture coordinates processing
  41. // - for color texture
  42. float  RsFALL_C_TCScaleX : C_TCSCALEX = 1.0;
  43. float  RsFALL_C_TCScaleY : C_TCSCALEY = 1.0;
  44. float  RsFALL_C_TCMoveX : C_TCMOVEX = 0.0;
  45. float  RsFALL_C_TCMoveY : C_TCMOVEY = 0.0;
  46.  
  47. // - for normal map
  48. float  RsFALL_N_TCScaleX : N_TCSCALEX = 1.0;
  49. float  RsFALL_N_TCScaleY : N_TCSCALEY = 1.0;
  50. float  RsFALL_N_TCMoveX : N_TCMOVEX = 0.0;
  51. float  RsFALL_N_TCMoveY : N_TCMOVEY = 0.0;
  52.  
  53. //------------------------------
  54. //Light  processing - only omni lights are supported
  55. float4 RsFALL_LightPos : LIGHTPOSITION = float4(0.0, 0.0, 0.0, 1.0);
  56. float4 RsFALL_LightColor : LIGHTCOLOR = float4(1.0, 1.0, 1.0, 1.0);
  57. float RsFALL_LightAttenA : LIGHTATTENA = 0.005;
  58. float RsFALL_LightAttenB : LIGHTATTENB  = 0.0;
  59. float RsFALL_LightAttenC : LIGHTATTENC  = 1.0;
  60.  
  61. //------------------------------
  62. //PS 1.4 Specular maps
  63. //
  64. texture RsFALL_PS14SpecularMap : RsFALL_PS14SpecularMap;
  65.  
  66. sampler RsFALL_smplDiffuse = sampler_state {
  67.     Texture = <RsFALL_DiffuseMap>;
  68.  
  69.     MinFilter = LINEAR;
  70.     MagFilter = LINEAR;
  71.     MipFilter = LINEAR;
  72.  
  73.     AddressU = WRAP;
  74.     AddressV = WRAP;
  75. };
  76.  
  77. sampler RsFALL_smplNormal = sampler_state {
  78.     Texture = <RsFALL_NormalMap>;
  79.  
  80.     MinFilter = LINEAR;
  81.     MagFilter = LINEAR;
  82.     MipFilter = LINEAR;
  83.  
  84.     AddressU = WRAP;
  85.     AddressV = WRAP;
  86. };
  87.  
  88. sampler RsFALL_smplSpecular = sampler_state {
  89.     Texture = <RsFALL_PS14SpecularMap>;
  90.  
  91.     MinFilter = LINEAR;
  92.     MagFilter = LINEAR;
  93.     MipFilter = LINEAR;
  94.  
  95.     AddressU = CLAMP;
  96.     AddressV = CLAMP;
  97. };
  98.  
  99. float3x3 RsD3DComputeTangentTransform(float3 vTangent, float3 vNormal, in float3x3 mToWorld) 
  100. {
  101.     float3x3 mToTangent;
  102.     mToTangent[0] = normalize(mul(vTangent * RsD3DMaterialFromME_fNormalMod, mToWorld));
  103.     mToTangent[2] = normalize(mul(vNormal * RsD3DMaterialFromME_fNormalMod, mToWorld));
  104.     mToTangent[1] = cross(mToTangent[0], mToTangent[2]);
  105.     return mToTangent;
  106. }
  107.  
  108. float2 RsD3DComputeColorTexCoords(float2 vInputCoords) 
  109. {
  110.     float2 vRetVal = vInputCoords;
  111.     vRetVal.x = vInputCoords.x * RsFALL_C_TCScaleX + RsFALL_C_TCMoveX;
  112.     vRetVal.y = vInputCoords.y * RsFALL_C_TCScaleY + RsFALL_C_TCMoveY;
  113.     return vRetVal;
  114. }
  115.  
  116. float2 RsD3DComputeNormalTexCoords(float2 vInputCoords) 
  117. {
  118.     float2 vRetVal = vInputCoords;
  119.     vRetVal.x = vInputCoords.x * RsFALL_N_TCScaleX + RsFALL_N_TCMoveX;
  120.     vRetVal.y = vInputCoords.y * RsFALL_N_TCScaleY + RsFALL_N_TCMoveY;
  121.     return vRetVal;
  122. }
  123.  
  124. float4 RsD3DComputeLightColor(float fDistToLight)
  125. {
  126.     float fAttenuation = RsFALL_LightAttenA * fDistToLight * fDistToLight + RsFALL_LightAttenB * fDistToLight + RsFALL_LightAttenC;
  127.     return RsFALL_LightColor * saturate(1.0f / fAttenuation);
  128. }
  129.  
  130. //------------------------------
  131. // This is a fallback code for PS 2.0 hardware
  132. // We do per pixel diffuse and per pixel specular
  133. //------------------------------
  134. struct VS_OUTPUT_PS20 {
  135.     float4 vClipPos     : POSITION;     //Clipping space position
  136.     float2 tcCoordC     : TEXCOORD0;    //texture coordinates
  137.     float2 tcCoordN     : TEXCOORD1;    //texture coordinates
  138.     float3 vLight       : TEXCOORD2;    //light vector
  139.     float3 vEye         : TEXCOORD3;    //eye vector
  140.     float4 vDistToLight : TEXCOORD4;    //distance from light
  141.     float4 cVertexColor : TEXCOORD5;    //vertex color
  142. };
  143.  
  144. VS_OUTPUT_PS20 VS_Fallback_ForPS20HW(in D3_VERTEXINPUT input)
  145. {
  146.     VS_OUTPUT_PS20 output;
  147.  
  148.     //Following code outputs position and texture coordinates
  149.     //------------------------------
  150.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  151.     output.tcCoordC = RsD3DComputeColorTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  152.     output.tcCoordN = RsD3DComputeNormalTexCoords(input.D3_vInputTexCoords2); //Texture coordinates for normal texture
  153.  
  154.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  155.     float3x3 mToTangent = RsD3DComputeTangentTransform(input.D3_vInputTangent, input.D3_vInputNormal, D3_mObjectToWorldN);
  156.  
  157.     //Compute light and eye vectors
  158.     //------------------------------
  159.     float3 vToLight = RsFALL_LightPos.xyz - pVertexWorld.xyz;
  160.     output.vLight = mul(mToTangent, normalize(vToLight));
  161.     output.vDistToLight = length(vToLight);
  162.  
  163.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  164.     output.vEye = mul(mToTangent, vToEye);
  165.  
  166.     output.cVertexColor = input.D3_cInputColor * RsFALL_VertexColorStrength + RsFALL_DiffuseColor;
  167.  
  168.     return output;
  169. }
  170.  
  171. float4 PS_Fallback_ForPS20HW(uniform bool EnableAlpha, uniform bool IsFirstPass, in VS_OUTPUT_PS20 input) : COLOR0
  172. {
  173.     float4 cDecal = tex2D(RsFALL_smplDiffuse, input.tcCoordC);
  174.     float3 cNormal = tex2D(RsFALL_smplNormal, input.tcCoordN).xyz;
  175.     float3 vNormal = normalize(2.0f * cNormal - 1.0f);    //expand to the range -1,1
  176.     float3 vEye = normalize(input.vEye);
  177.     float3 vLight = normalize(input.vLight);
  178.  
  179.     float4 cLightColor = RsD3DComputeLightColor(input.vDistToLight.w);
  180.  
  181.     float3 vRefVec = dot(vLight, vNormal) * 2.0f * vNormal - vLight;
  182.     float fEyeDotRef = max(0, dot(vRefVec, vEye));
  183.     float4 cSpecularCol = RsFALL_SpecularColor * pow(fEyeDotRef, RsFALL_Shininess);
  184.  
  185.     float fDiffuseDot = saturate(dot(vNormal, vLight));
  186.     float4 diffuseColor = input.cVertexColor + RsFALL_DiffuseMapStrength * cDecal;
  187.     float4 cOut = cLightColor * (cSpecularCol * RsFALL_SpecularStrength + diffuseColor * fDiffuseDot * RsFALL_DiffuseStrength);
  188.     if (EnableAlpha)
  189.         cOut.a = RsD3DMaterialFromME_fOpacity;
  190.  
  191.     ///Add the overlay color
  192.     if (IsFirstPass)
  193.     {
  194.         ///First pass performs complete blending.
  195.         cOut.xyz = RsD3DMaterialFromME_cOverlayMod.xyz + RsD3DMaterialFromME_cOverlayMod.a * cOut.xyz;
  196.     }
  197.     else
  198.     {
  199.         ///All other passes just attenuate the lighting accordingly.
  200.         cOut.xyz = RsD3DMaterialFromME_cOverlayMod.a * cOut.xyz;
  201.     }
  202.     return cOut;
  203. }
  204.  
  205. technique D3_FALLBACK_TECHNIQUE_PS20
  206. <
  207.     string Rs_TechniqueMode = "firstlight";
  208.     string Rs_TechniqueOpacity = "opaque";
  209.     string Rs_TechniqueQuality = "75";
  210. >
  211. {
  212.     pass D3_FALLBACK_PASS_02_PS20
  213.     {
  214.         VertexShader = compile vs_2_0 VS_Fallback_ForPS20HW();
  215.         PixelShader = compile ps_2_0 PS_Fallback_ForPS20HW(false, true);
  216.  
  217.         AlphaBlendEnable = false;
  218.  
  219.         ZEnable = true;
  220.         ZFunc = LESSEQUAL;
  221.         ZWriteEnable = true;
  222.         
  223.         CullMode = CCW;
  224.     }
  225. }
  226.  
  227. technique D3_FALLBACK_TECHNIQUE_PS20_MORELIGHTS
  228. <
  229.     string Rs_TechniqueMode = "morelights";
  230.     string Rs_TechniqueOpacity = "opaque";
  231.     string Rs_TechniqueQuality = "75";
  232. >
  233. {
  234.     pass D3_FALLBACK_PASS_02_PS20
  235.     {
  236.         VertexShader = compile vs_2_0 VS_Fallback_ForPS20HW();
  237.         PixelShader = compile ps_2_0 PS_Fallback_ForPS20HW(false, false);
  238.  
  239.         AlphaBlendEnable = true;
  240.         SrcBlend = ONE;
  241.         DestBlend = ONE;
  242.  
  243.         ZEnable = true;
  244.         ZFunc = LESSEQUAL;
  245.         ZWriteEnable = false;
  246.         
  247.         CullMode = CCW;
  248.     }
  249. }
  250.  
  251. technique D3_FALLBACK_TECHNIQUE_PS20_T
  252. <
  253.     string Rs_TechniqueMode = "firstlight";
  254.     string Rs_TechniqueOpacity = "transparent";
  255.     string Rs_TechniqueQuality = "75";
  256. >
  257. {
  258.     pass D3_FALLBACK_PASS_02_PS20
  259.     {
  260.         VertexShader = compile vs_2_0 VS_Fallback_ForPS20HW();
  261.         PixelShader = compile ps_2_0 PS_Fallback_ForPS20HW(true, true);
  262.  
  263.         AlphaBlendEnable = true;
  264.         SrcBlend = SRCALPHA;
  265.         DestBlend = INVSRCALPHA;
  266.  
  267.         ZEnable = true;
  268.         ZFunc = LESSEQUAL;
  269.         ZWriteEnable = false;
  270.         
  271.         CullMode = CCW;
  272.     }
  273. }
  274.  
  275. technique D3_FALLBACK_TECHNIQUE_PS20_MORELIGHTS_T
  276. <
  277.     string Rs_TechniqueMode = "morelights";
  278.     string Rs_TechniqueOpacity = "transparent";
  279.     string Rs_TechniqueQuality = "75";
  280. >
  281. {
  282.     pass D3_FALLBACK_PASS_02_PS20
  283.     {
  284.         VertexShader = compile vs_2_0 VS_Fallback_ForPS20HW();
  285.         PixelShader = compile ps_2_0 PS_Fallback_ForPS20HW(true, false);
  286.  
  287.         AlphaBlendEnable = true;
  288.         SrcBlend = SRCALPHA;
  289.         DestBlend = ONE;
  290.  
  291.         ZEnable = true;
  292.         ZFunc = LESSEQUAL;
  293.         ZWriteEnable = false;
  294.         
  295.         CullMode = CCW;
  296.     }
  297. }
  298.  
  299. //------------------------------
  300. // This is a fallback code for PS 1.4 hardware
  301. // We do per pixel diffuse and per pixel specular. Attenuation is computed per vertex.
  302. //------------------------------
  303. struct VS_OUTPUT_PS14 {
  304.     float4 vClipPos     : POSITION;     //Clipping space position
  305.     float2 tcCoordC     : TEXCOORD0;    //texture coordinates
  306.     float2 tcCoordN     : TEXCOORD1;    //texture coordinates
  307.     float3 vLight       : TEXCOORD2;    //light vector
  308.     float3 vEye         : TEXCOORD3;    //eye vector
  309.     float4 fShininess   : TEXCOORD4;    //Shininess transfer
  310.     float4 cLightColor  : COLOR1;       //light color with attenuation
  311.     float4 cVertexColor : COLOR0;       //vertex color
  312. };
  313.  
  314. VS_OUTPUT_PS14 VS_Fallback_ForPS14HW(in D3_VERTEXINPUT input)
  315. {
  316.     VS_OUTPUT_PS14 output;
  317.  
  318.     //Following code outputs position and texture coordinates
  319.     //------------------------------
  320.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  321.     output.tcCoordC = RsD3DComputeColorTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  322.     output.tcCoordN = RsD3DComputeNormalTexCoords(input.D3_vInputTexCoords2); //Texture coordinates for normal texture
  323.  
  324.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  325.     float3x3 mToTangent = RsD3DComputeTangentTransform(input.D3_vInputTangent, input.D3_vInputNormal, D3_mObjectToWorldN);
  326.  
  327.     //Compute light and eye vectors
  328.     //------------------------------
  329.     float3 vToLight = RsFALL_LightPos.xyz - pVertexWorld.xyz;
  330.     float  fRealDistToLight = length(vToLight);
  331.     vToLight = normalize(vToLight);
  332.     output.vLight = mul(mToTangent, vToLight);
  333.  
  334.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  335.     output.vEye = mul(mToTangent, vToEye);
  336.  
  337.     ///We do overlay multiplication here
  338.     output.cLightColor = RsD3DMaterialFromME_cOverlayMod.a * RsD3DComputeLightColor(fRealDistToLight);
  339.  
  340.     output.cVertexColor = input.D3_cInputColor * RsFALL_VertexColorStrength + RsFALL_DiffuseColor;
  341.     output.fShininess = RsFALL_Shininess / 100.0f;
  342.  
  343.     return output;
  344. }
  345.  
  346. float4 PS_Fallback_ForPS14HW(uniform bool EnableAlpha, uniform bool IsFirstPass, in VS_OUTPUT_PS14 input) : COLOR0
  347. {
  348.     float4 cDecal = tex2D(RsFALL_smplDiffuse, input.tcCoordC);
  349.     float3 cNormal = tex2D(RsFALL_smplNormal, input.tcCoordN).xyz;
  350.     float3 vNormal = 2.0f * cNormal - 1.0f;
  351.     float3 vLight = input.vLight;
  352.  
  353.     float fNdotL = dot(vLight, vNormal);
  354.     float4 diffuseColor = input.cVertexColor + RsFALL_DiffuseMapStrength * cDecal;
  355.  
  356.     //Specular term
  357.     float3 vEye = input.vEye;
  358.     float3 vRefVec = 2.0f * fNdotL * vNormal - vLight;
  359.     float2 vCoord = input.fShininess;
  360.     vCoord.x = dot(vEye, vRefVec);
  361.     float4 cSpecularTerm = tex2D(RsFALL_smplSpecular, vCoord);
  362.     float4 cSpecularCol = RsFALL_SpecularColor * cSpecularTerm.a;
  363.     
  364.     float4 cOut;
  365.     cOut = input.cLightColor * (cSpecularCol * RsFALL_SpecularStrength + diffuseColor * saturate(fNdotL) * RsFALL_DiffuseStrength);
  366.     if (EnableAlpha)
  367.         cOut.a = RsD3DMaterialFromME_fOpacity;
  368.  
  369.     ///Add the overlay color
  370.     if (IsFirstPass)
  371.     {
  372.         ///First pass performs complete blending.
  373.         cOut = RsD3DMaterialFromME_cOverlayMod + cOut;
  374.     }
  375.     return cOut;
  376. }
  377.  
  378. technique D3_FALLBACK_TECHNIQUE_PS14
  379. <
  380.     string Rs_TechniqueMode = "firstlight";
  381.     string Rs_TechniqueOpacity = "opaque";
  382.     string Rs_TechniqueQuality = "65";
  383. >
  384. {
  385.     pass D3_FALLBACK_PASS_02_PS20
  386.     {
  387.         VertexShader = compile vs_1_1 VS_Fallback_ForPS14HW();
  388.         PixelShader = compile ps_1_4 PS_Fallback_ForPS14HW(false, true);
  389.  
  390.         AlphaBlendEnable = false;
  391.         ZEnable = true;
  392.         ZFunc = LESSEQUAL;
  393.         ZWriteEnable = true;
  394.  
  395.         CullMode = CCW;
  396.     }
  397. }
  398.  
  399. technique D3_FALLBACK_TECHNIQUE_PS14_MORELIGHT
  400. <
  401.     string Rs_TechniqueMode = "morelights";
  402.     string Rs_TechniqueOpacity = "opaque";
  403.     string Rs_TechniqueQuality = "65";
  404. >
  405. {
  406.     pass D3_FALLBACK_PASS_02_PS20
  407.     {
  408.         VertexShader = compile vs_1_1 VS_Fallback_ForPS14HW();
  409.         PixelShader = compile ps_1_4 PS_Fallback_ForPS14HW(false, false);
  410.  
  411.         AlphaBlendEnable = true;
  412.         SrcBlend = ONE;
  413.         DestBlend = ONE;
  414.  
  415.         ZEnable = true;
  416.         ZFunc = LESSEQUAL;
  417.         ZWriteEnable = false;
  418.  
  419.         CullMode = CCW;
  420.     }
  421. }
  422.  
  423. technique D3_FALLBACK_TECHNIQUE_PS14_T
  424. <
  425.     string Rs_TechniqueMode = "firstlight";
  426.     string Rs_TechniqueOpacity = "transparent";
  427.     string Rs_TechniqueQuality = "65";
  428. >
  429. {
  430.     pass D3_FALLBACK_PASS_02_PS20
  431.     {
  432.         VertexShader = compile vs_1_1 VS_Fallback_ForPS14HW();
  433.         PixelShader = compile ps_1_4 PS_Fallback_ForPS14HW(true, true);
  434.  
  435.         AlphaBlendEnable = true;
  436.         SrcBlend = SRCALPHA;
  437.         DestBlend = INVSRCALPHA;
  438.  
  439.         ZEnable = true;
  440.         ZFunc = LESSEQUAL;
  441.         ZWriteEnable = false;
  442.  
  443.         CullMode = CCW;
  444.     }
  445. }
  446.  
  447. technique D3_FALLBACK_TECHNIQUE_PS14_MORELIGHT_T
  448. <
  449.     string Rs_TechniqueMode = "morelights";
  450.     string Rs_TechniqueOpacity = "transparent";
  451.     string Rs_TechniqueQuality = "65";
  452. >
  453. {
  454.     pass D3_FALLBACK_PASS_02_PS20
  455.     {
  456.         VertexShader = compile vs_1_1 VS_Fallback_ForPS14HW();
  457.         PixelShader = compile ps_1_4 PS_Fallback_ForPS14HW(true, false);
  458.  
  459.         AlphaBlendEnable = true;
  460.         SrcBlend = SRCALPHA;
  461.         DestBlend = ONE;
  462.  
  463.         ZEnable = true;
  464.         ZFunc = LESSEQUAL;
  465.         ZWriteEnable = false;
  466.  
  467.         CullMode = CCW;
  468.     }
  469. }
  470.  
  471. //------------------------------
  472. // This is a fallback code for PS 1.1 hardware
  473. // We do per pixel diffuse and per vertex specular
  474. //------------------------------
  475. struct VS_OUTPUT_PS11 {
  476.     float4 vClipPos     : POSITION; //Clipping space position
  477.     float4 cVertexColor : TEXCOORD3;   //vertex color
  478.     float4 cLightColor  : COLOR1;   //light color with attenuation
  479.     float2 tcCoordC     : TEXCOORD0;//texture coordinates
  480.     float2 tcCoordN     : TEXCOORD1;//texture coordinates
  481.     float3 vLight       : TEXCOORD2;//light vector
  482.     float4 cSpecularCol : COLOR0;   //complete specular color component
  483. };
  484.  
  485. VS_OUTPUT_PS11 VS_Fallback_ForPS11HW(uniform bool EnableAlpha, in D3_VERTEXINPUT input)
  486. {
  487.     VS_OUTPUT_PS11 output;
  488.  
  489.     //Following code outputs position and texture coordinates
  490.     //------------------------------
  491.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  492.     output.tcCoordC = RsD3DComputeColorTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  493.     output.tcCoordN = RsD3DComputeNormalTexCoords(input.D3_vInputTexCoords2); //Texture coordinates for normal texture
  494.  
  495.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  496.     float3x3 mToTangent = RsD3DComputeTangentTransform(input.D3_vInputTangent, input.D3_vInputNormal, D3_mObjectToWorldN);
  497.  
  498.     //Compute light and eye vectors
  499.     //------------------------------
  500.     float3 vToLight = RsFALL_LightPos.xyz - pVertexWorld.xyz;
  501.     float  fRealDistToLight = length(vToLight);
  502.     vToLight = normalize(vToLight);
  503.     output.vLight = mul(mToTangent, vToLight);
  504.     output.vLight = 0.5 * output.vLight + 0.5;
  505.  
  506.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  507.  
  508.     float4 vLightColor = RsD3DComputeLightColor(fRealDistToLight);
  509.  
  510.     //Compute final per vertex color using
  511.     //------------------------------
  512.     float3 vRefVec = dot(vToLight, mToTangent[2]) * 2 * mToTangent[2] - vToLight;
  513.     float fEyeDotRef = saturate(dot(vRefVec, vToEye));
  514.  
  515.     output.cSpecularCol = vLightColor * RsFALL_SpecularColor * pow(fEyeDotRef, RsFALL_Shininess) * RsFALL_SpecularStrength;
  516.     output.cLightColor = vLightColor * RsFALL_DiffuseStrength;
  517.     output.cVertexColor = (input.D3_cInputColor * RsFALL_VertexColorStrength + RsFALL_DiffuseColor) * output.cLightColor;
  518.  
  519.     if (EnableAlpha)
  520.         output.cSpecularCol.a = RsD3DMaterialFromME_fOpacity;
  521.     else
  522.         output.cSpecularCol.a = 1.0f;
  523.  
  524.     return output;
  525. }
  526.  
  527. float4 PS_Fallback_ForPS11HW(uniform bool IsFirstPass, in VS_OUTPUT_PS11 input) : COLOR0
  528. {
  529.     float4 cDecal = tex2D(RsFALL_smplDiffuse, input.tcCoordC);
  530.     float3 cNormal = tex2D(RsFALL_smplNormal, input.tcCoordN).xyz;
  531.     float3 vNormal = 2.0f * cNormal - 1.0f;    //expand to the range -1,1
  532.     float3 vLight = 2.0f * saturate(input.vLight) - 1.0f;    //expand to the range -1,1
  533.     float fDiffuseDot = saturate(dot(vNormal, vLight));
  534.     float3 diffuseMap = RsFALL_DiffuseMapStrength * cDecal;
  535.     float4 cOut = input.cSpecularCol.a;
  536.     cOut.xyz = input.cSpecularCol + (input.cVertexColor + input.cLightColor * diffuseMap) * fDiffuseDot;
  537.  
  538.     ///Add the overlay color
  539.     if (IsFirstPass)
  540.     {
  541.         ///First pass performs complete blending.
  542.         cOut.xyz = RsD3DMaterialFromME_cOverlayMod.xyz + RsD3DMaterialFromME_cOverlayMod.a * cOut.xyz;
  543.     }
  544.     else
  545.     {
  546.         ///All other passes just attenuate the lighting accordingly.
  547.         cOut.xyz = RsD3DMaterialFromME_cOverlayMod.a * cOut.xyz;
  548.     }
  549.     return cOut;
  550. }
  551.  
  552. technique D3_FALLBACK_TECHNIQUE_PS11
  553. <
  554.     string Rs_TechniqueMode = "firstlight";
  555.     string Rs_TechniqueOpacity = "opaque";
  556.     string Rs_TechniqueQuality = "45";
  557. >
  558. {
  559.     pass D3_FALLBACK_PASS_02_PS11
  560.     {
  561.         VertexShader = compile vs_1_1 VS_Fallback_ForPS11HW(false);
  562.         PixelShader = compile ps_1_1 PS_Fallback_ForPS11HW(true);
  563.  
  564.         AlphaBlendEnable = false;
  565.         ZEnable = true;
  566.         ZFunc = LESSEQUAL;
  567.         ZWriteEnable = true;
  568.  
  569.         CullMode = CCW;
  570.     }
  571. }
  572.  
  573. technique D3_FALLBACK_TECHNIQUE_PS11_MORELIGHT
  574. <
  575.     string Rs_TechniqueMode = "morelights";
  576.     string Rs_TechniqueOpacity = "opaque";
  577.     string Rs_TechniqueQuality = "45";
  578. >
  579. {
  580.     pass D3_FALLBACK_PASS_02_PS11
  581.     {
  582.         VertexShader = compile vs_1_1 VS_Fallback_ForPS11HW(false);
  583.         PixelShader = compile ps_1_1 PS_Fallback_ForPS11HW(false);
  584.  
  585.         AlphaBlendEnable = true;
  586.  
  587.         SrcBlend = ONE;
  588.         DestBlend = ONE;
  589.  
  590.         ZEnable = true;
  591.         ZFunc = LESSEQUAL;
  592.         ZWriteEnable = false;
  593.  
  594.         CullMode = CCW;
  595.     }
  596. }
  597.  
  598. technique D3_FALLBACK_TECHNIQUE_PS11_T
  599. <
  600.     string Rs_TechniqueMode = "firstlight";
  601.     string Rs_TechniqueOpacity = "transparent";
  602.     string Rs_TechniqueQuality = "45";
  603. >
  604. {
  605.     pass D3_FALLBACK_PASS_02_PS11
  606.     {
  607.         VertexShader = compile vs_1_1 VS_Fallback_ForPS11HW(true);
  608.         PixelShader = compile ps_1_1 PS_Fallback_ForPS11HW(true);
  609.  
  610.         AlphaBlendEnable = true;
  611.         SrcBlend = SRCALPHA;
  612.         DestBlend = INVSRCALPHA;
  613.  
  614.         ZEnable = true;
  615.         ZFunc = LESSEQUAL;
  616.         ZWriteEnable = false;
  617.  
  618.         CullMode = CCW;
  619.     }
  620. }
  621.  
  622. technique D3_FALLBACK_TECHNIQUE_PS11_MORELIGHT_T
  623. <
  624.     string Rs_TechniqueMode = "morelights";
  625.     string Rs_TechniqueOpacity = "transparent";
  626.     string Rs_TechniqueQuality = "45";
  627. >
  628. {
  629.     pass D3_FALLBACK_PASS_02_PS11
  630.     {
  631.         VertexShader = compile vs_1_1 VS_Fallback_ForPS11HW(true);
  632.         PixelShader = compile ps_1_1 PS_Fallback_ForPS11HW(false);
  633.  
  634.         AlphaBlendEnable = true;
  635.         SrcBlend = SRCALPHA;
  636.         DestBlend = ONE;
  637.  
  638.         ZEnable = true;
  639.         ZFunc = LESSEQUAL;
  640.         ZWriteEnable = false;
  641.  
  642.         CullMode = CCW;
  643.     }
  644. }
  645.  
  646. //------------------------------
  647. // This is a fallback code for old DX7 hardware even without DOT3 capabilities
  648. // Entire lighting is computed per vertex and diffuse texture is used.
  649. //------------------------------
  650. struct VS_OUTPUT_SIMPLE_DX7 {
  651.     float4 vClipPos: POSITION;      //Clipping space position
  652.     float2 tcCoord0: TEXCOORD0;     //Texture coordinates
  653.     float4 cColor0 : COLOR0;        //diffuse map mod
  654.     float4 cColor1 : COLOR1;        //specular color + diffuse color mod
  655. };
  656.  
  657. VS_OUTPUT_SIMPLE_DX7 VS_Fallback_Simple_DX7(uniform bool EnableAlpha, uniform bool IsFirstPass, in D3_VERTEXINPUT input) 
  658. {
  659.     VS_OUTPUT_SIMPLE_DX7 output;
  660.  
  661.     //Following code outputs position and texture coordinates
  662.     //------------------------------
  663.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  664.     output.tcCoord0 = RsD3DComputeColorTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  665.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  666.  
  667.     //Compute light and eye vectors
  668.     //------------------------------
  669.     float3 vToLight = RsFALL_LightPos.xyz - pVertexWorld.xyz;
  670.     float  fRealDistToLight = length(vToLight);
  671.     vToLight = normalize(vToLight);
  672.  
  673.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  674.  
  675.     float4 output_cLightColor = RsD3DComputeLightColor(fRealDistToLight);
  676.  
  677.     //Compute final per vertex color using light/specular/diffuse
  678.     //------------------------------
  679.     float3 vNormal = normalize(mul(input.D3_vInputNormal * RsD3DMaterialFromME_fNormalMod, D3_mObjectToWorldN));
  680.     float3 vRefVec = dot(vToLight, vNormal) * 2 * vNormal - vToLight;
  681.     float fEyeDotRef = max(0, dot(vRefVec, vToEye));
  682.  
  683.     float4 output_cSpecularCol = RsFALL_SpecularColor * pow(fEyeDotRef, RsFALL_Shininess);
  684.     float4 output_cVertexColor = input.D3_cInputColor * RsFALL_VertexColorStrength + RsFALL_DiffuseColor;
  685.  
  686.     float fDiffuseDot = saturate(dot(vNormal, vToLight)) * RsFALL_DiffuseStrength;
  687.     output.cColor0 = saturate(output_cLightColor * RsFALL_DiffuseMapStrength * fDiffuseDot);
  688.     output.cColor1 = saturate(output_cLightColor * (output_cSpecularCol * RsFALL_SpecularStrength + (output_cVertexColor * fDiffuseDot)));
  689.     if (EnableAlpha)
  690.     {
  691.         output.cColor0.a = RsD3DMaterialFromME_fOpacity;
  692.         output.cColor1.a = 0;
  693.     }
  694.  
  695.     ///Add the overlay color
  696.     if (IsFirstPass)
  697.     {
  698.         ///First pass performs complete blending.
  699.         output.cColor0.xyz = RsD3DMaterialFromME_cOverlayMod.a * output.cColor0.xyz;
  700.         output.cColor1.xyz = RsD3DMaterialFromME_cOverlayMod.xyz + RsD3DMaterialFromME_cOverlayMod.a * output.cColor1.xyz;
  701.     }
  702.     else
  703.     {
  704.         ///All other passes just attenuate the lighting accordingly.
  705.         output.cColor0.xyz = RsD3DMaterialFromME_cOverlayMod.a * output.cColor0.xyz;
  706.         output.cColor1.xyz = RsD3DMaterialFromME_cOverlayMod.a * output.cColor1.xyz;
  707.     }
  708.     return output;
  709. }
  710.  
  711. //The Dx7 with explicit textureoperations
  712. technique D3_FALLBACK_TECHNIQUE_DX7
  713. <
  714.     string Rs_TechniqueMode = "firstlight";
  715.     string Rs_TechniqueOpacity = "opaque";
  716.     string Rs_TechniqueQuality = "35";
  717. >
  718. {
  719.     pass D3_FALLBACK_PASS_02
  720.     {
  721.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(false, true);
  722.         PixelShader = NULL;
  723.  
  724.         AlphaBlendEnable = false;
  725.         ZEnable = true;
  726.         ZFunc = LESSEQUAL;
  727.         ZWriteEnable = true;
  728.         
  729.         // Set texture filtering.
  730.         MinFilter[0] = Linear;
  731.         MagFilter[0] = Linear;
  732.         MipFilter[0] = Point;
  733.  
  734.         // Set texture into stage 0.
  735.         Texture[0]   = (RsFALL_DiffuseMap);
  736.         ColorOp[0]   = MODULATE;
  737.         ColorArg1[0] = DIFFUSE;
  738.         ColorArg2[0] = TEXTURE;
  739.         ColorOp[1]   = ADD;
  740.         ColorArg1[1] = CURRENT;
  741.         ColorArg2[1] = SPECULAR;
  742.         ColorOp[2]   = DISABLE;
  743.  
  744.         SpecularEnable = false;
  745.         ColorVertex = false;        
  746.  
  747.         Lighting = false;
  748.         ShadeMode = GOURAUD;
  749.  
  750.         CullMode = CCW;
  751.     }
  752. }
  753.  
  754. technique D3_FALLBACK_TECHNIQUE_DX7_MORELIGHTS
  755. <
  756.     string Rs_TechniqueMode = "morelights";
  757.     string Rs_TechniqueOpacity = "opaque";
  758.     string Rs_TechniqueQuality = "35";
  759. >
  760. {
  761.     pass D3_FALLBACK_PASS_02
  762.     {
  763.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(false, false);
  764.         PixelShader = NULL;
  765.  
  766.         AlphaBlendEnable = true;
  767.  
  768.         SrcBlend = ONE;
  769.         DestBlend = ONE;
  770.  
  771.         ZEnable = true;
  772.         ZFunc = LESSEQUAL;
  773.         ZWriteEnable = false;
  774.         
  775.         // Set texture filtering.
  776.         MinFilter[0] = Linear;
  777.         MagFilter[0] = Linear;
  778.         MipFilter[0] = Point;
  779.  
  780.         // Set texture into stage 0.
  781.         Texture[0]   = (RsFALL_DiffuseMap);
  782.         ColorOp[0]   = MODULATE;
  783.         ColorArg1[0] = DIFFUSE;
  784.         ColorArg2[0] = TEXTURE;
  785.         ColorOp[1]   = ADD;
  786.         ColorArg1[1] = CURRENT;
  787.         ColorArg2[1] = SPECULAR;
  788.         ColorOp[2]   = DISABLE;
  789.  
  790.         SpecularEnable = false;
  791.         ColorVertex = false;        
  792.  
  793.         Lighting = false;
  794.         ShadeMode = GOURAUD;
  795.  
  796.         CullMode = CCW;
  797.     }
  798. }
  799.  
  800. technique D3_FALLBACK_TECHNIQUE_DX7_T
  801. <
  802.     string Rs_TechniqueMode = "firstlight";
  803.     string Rs_TechniqueOpacity = "transparent";
  804.     string Rs_TechniqueQuality = "35";
  805. >
  806. {
  807.     pass D3_FALLBACK_PASS_02
  808.     {
  809.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(true, true);
  810.         PixelShader = NULL;
  811.  
  812.         AlphaBlendEnable = true;
  813.         SrcBlend = SRCALPHA;
  814.         DestBlend = INVSRCALPHA;
  815.  
  816.         ZEnable = true;
  817.         ZFunc = LESSEQUAL;
  818.         ZWriteEnable = false;
  819.         
  820.         // Set texture filtering.
  821.         MinFilter[0] = Linear;
  822.         MagFilter[0] = Linear;
  823.         MipFilter[0] = Point;
  824.  
  825.         // Set texture into stage 0.
  826.         Texture[0]   = (RsFALL_DiffuseMap);
  827.         ColorOp[0]   = MODULATE;
  828.         ColorArg1[0] = DIFFUSE;
  829.         ColorArg2[0] = TEXTURE;
  830.         ColorOp[1]   = ADD;
  831.         ColorArg1[1] = CURRENT;
  832.         ColorArg2[1] = SPECULAR;
  833.         ColorOp[2]   = DISABLE;
  834.         AlphaOp[0]   = SELECTARG1;
  835.         AlphaArg1[0] = DIFFUSE;
  836.         AlphaOp[1]   = DISABLE;
  837.  
  838.         SpecularEnable = false;
  839.         ColorVertex = false;        
  840.  
  841.         Lighting = false;
  842.         ShadeMode = GOURAUD;
  843.  
  844.         CullMode = CCW;
  845.     }
  846. }
  847.  
  848. technique D3_FALLBACK_TECHNIQUE_DX7_MORELIGHTS_T
  849. <
  850.     string Rs_TechniqueMode = "morelights";
  851.     string Rs_TechniqueOpacity = "transparent";
  852.     string Rs_TechniqueQuality = "35";
  853. >
  854. {
  855.     pass D3_FALLBACK_PASS_02
  856.     {
  857.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(true, false);
  858.         PixelShader = NULL;
  859.  
  860.         AlphaBlendEnable = true;
  861.         SrcBlend = SRCALPHA;
  862.         DestBlend = ONE;
  863.  
  864.         ZEnable = true;
  865.         ZFunc = LESSEQUAL;
  866.         ZWriteEnable = false;
  867.         
  868.         // Set texture filtering.
  869.         MinFilter[0] = Linear;
  870.         MagFilter[0] = Linear;
  871.         MipFilter[0] = Point;
  872.  
  873.         // Set texture into stage 0.
  874.         Texture[0]   = (RsFALL_DiffuseMap);
  875.         ColorOp[0]   = MODULATE;
  876.         ColorArg1[0] = DIFFUSE;
  877.         ColorArg2[0] = TEXTURE;
  878.         ColorOp[1]   = ADD;
  879.         ColorArg1[1] = CURRENT;
  880.         ColorArg2[1] = SPECULAR;
  881.         ColorOp[2]   = DISABLE;
  882.         AlphaOp[0]   = SELECTARG1;
  883.         AlphaArg1[0] = DIFFUSE;
  884.         AlphaOp[1]   = DISABLE;
  885.  
  886.         SpecularEnable = false;
  887.         ColorVertex = false;        
  888.  
  889.         Lighting = false;
  890.         ShadeMode = GOURAUD;
  891.  
  892.         CullMode = CCW;
  893.     }
  894. }
  895.  
  896. //The Dx7 without explicit texture cascade
  897. technique D3_FALLBACK_TECHNIQUE_DX7_JUSTALPHA
  898. <
  899.     string Rs_TechniqueMode = "firstlight";
  900.     string Rs_TechniqueOpacity = "opaque";
  901.     string Rs_TechniqueQuality = "35";
  902. >
  903. {
  904.     pass D3_FALLBACK_PASS_02
  905.     {
  906.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(false, true);
  907.         PixelShader = NULL;
  908.  
  909.         AlphaBlendEnable = false;
  910.         ZEnable = true;
  911.         ZFunc = LESSEQUAL;
  912.         ZWriteEnable = true;
  913.         
  914.         // Set texture filtering.
  915.         MinFilter[0] = Linear;
  916.         MagFilter[0] = Linear;
  917.         MipFilter[0] = Point;
  918.  
  919.         // Set texture into stage 0.
  920.         Texture[0]   = (RsFALL_DiffuseMap);
  921.  
  922.         SpecularEnable = true;
  923.         ColorVertex = true;        
  924.  
  925.         Lighting = false;
  926.         ShadeMode = GOURAUD;
  927.  
  928.         CullMode = CCW;
  929.     }
  930. }
  931.  
  932. technique D3_FALLBACK_TECHNIQUE_DX7_JUSTALPHA_MORELIGHTS
  933. <
  934.     string Rs_TechniqueMode = "morelights";
  935.     string Rs_TechniqueOpacity = "opaque";
  936.     string Rs_TechniqueQuality = "35";
  937. >
  938. {
  939.     pass D3_FALLBACK_PASS_02
  940.     {
  941.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(false, false);
  942.         PixelShader = NULL;
  943.  
  944.         AlphaBlendEnable = true;
  945.  
  946.         SrcBlend = ONE;
  947.         DestBlend = ONE;
  948.  
  949.         ZEnable = true;
  950.         ZFunc = LESSEQUAL;
  951.         ZWriteEnable = false;
  952.         
  953.         // Set texture filtering.
  954.         MinFilter[0] = Linear;
  955.         MagFilter[0] = Linear;
  956.         MipFilter[0] = Point;
  957.  
  958.         // Set texture into stage 0.
  959.         Texture[0]   = (RsFALL_DiffuseMap);
  960.  
  961.         SpecularEnable = true;
  962.         ColorVertex = true;        
  963.  
  964.         Lighting = false;
  965.         ShadeMode = GOURAUD;
  966.  
  967.         CullMode = CCW;
  968.     }
  969. }
  970.  
  971. technique D3_FALLBACK_TECHNIQUE_DX7_JUSTALPHA_T
  972. <
  973.     string Rs_TechniqueMode = "firstlight";
  974.     string Rs_TechniqueOpacity = "transparent";
  975.     string Rs_TechniqueQuality = "35";
  976. >
  977. {
  978.     pass D3_FALLBACK_PASS_02
  979.     {
  980.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(true, true);
  981.         PixelShader = NULL;
  982.  
  983.         AlphaBlendEnable = true;
  984.         SrcBlend = SRCALPHA;
  985.         DestBlend = INVSRCALPHA;
  986.  
  987.         ZEnable = true;
  988.         ZFunc = LESSEQUAL;
  989.         ZWriteEnable = false;
  990.         
  991.         // Set texture filtering.
  992.         MinFilter[0] = Linear;
  993.         MagFilter[0] = Linear;
  994.         MipFilter[0] = Point;
  995.  
  996.         // Set texture into stage 0.
  997.         Texture[0]   = (RsFALL_DiffuseMap);
  998.         AlphaOp[0]   = SELECTARG1;
  999.         AlphaArg1[0] = DIFFUSE;
  1000.         AlphaOp[1]   = DISABLE;
  1001.  
  1002.         SpecularEnable = true;
  1003.         ColorVertex = true;        
  1004.  
  1005.         Lighting = false;
  1006.         ShadeMode = GOURAUD;
  1007.  
  1008.         CullMode = CCW;
  1009.     }
  1010. }
  1011.  
  1012. technique D3_FALLBACK_TECHNIQUE_DX7_JUSTALPHA_MORELIGHTS_T
  1013. <
  1014.     string Rs_TechniqueMode = "morelights";
  1015.     string Rs_TechniqueOpacity = "transparent";
  1016.     string Rs_TechniqueQuality = "35";
  1017. >
  1018. {
  1019.     pass D3_FALLBACK_PASS_02
  1020.     {
  1021.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(true, false);
  1022.         PixelShader = NULL;
  1023.  
  1024.         AlphaBlendEnable = true;
  1025.         SrcBlend = SRCALPHA;
  1026.         DestBlend = ONE;
  1027.  
  1028.         ZEnable = true;
  1029.         ZFunc = LESSEQUAL;
  1030.         ZWriteEnable = false;
  1031.         
  1032.         // Set texture filtering.
  1033.         MinFilter[0] = Linear;
  1034.         MagFilter[0] = Linear;
  1035.         MipFilter[0] = Point;
  1036.  
  1037.         // Set texture into stage 0.
  1038.         Texture[0]   = (RsFALL_DiffuseMap);
  1039.         AlphaOp[0]   = SELECTARG1;
  1040.         AlphaArg1[0] = DIFFUSE;
  1041.         AlphaOp[1]   = DISABLE;
  1042.  
  1043.         SpecularEnable = true;
  1044.         ColorVertex = true;        
  1045.  
  1046.         Lighting = false;
  1047.         ShadeMode = GOURAUD;
  1048.  
  1049.         CullMode = CCW;
  1050.     }
  1051. }
  1052.  
  1053. //The Dx7 without explicit texture cascade
  1054. technique D3_FALLBACK_TECHNIQUE_DX7_NOMADD
  1055. <
  1056.     string Rs_TechniqueMode = "firstlight";
  1057.     string Rs_TechniqueOpacity = "opaque";
  1058.     string Rs_TechniqueQuality = "35";
  1059. >
  1060. {
  1061.     pass D3_FALLBACK_PASS_02
  1062.     {
  1063.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(false, true);
  1064.         PixelShader = NULL;
  1065.  
  1066.         AlphaBlendEnable = false;
  1067.         ZEnable = true;
  1068.         ZFunc = LESSEQUAL;
  1069.         ZWriteEnable = true;
  1070.         
  1071.         // Set texture filtering.
  1072.         MinFilter[0] = Linear;
  1073.         MagFilter[0] = Linear;
  1074.         MipFilter[0] = Point;
  1075.  
  1076.         // Set texture into stage 0.
  1077.         Texture[0]   = (RsFALL_DiffuseMap);
  1078.  
  1079.         SpecularEnable = true;
  1080.         ColorVertex = true;        
  1081.  
  1082.         Lighting = false;
  1083.         ShadeMode = GOURAUD;
  1084.  
  1085.         CullMode = CCW;
  1086.     }
  1087. }
  1088.  
  1089. technique D3_FALLBACK_TECHNIQUE_DX7_NOMADD_MORELIGHTS
  1090. <
  1091.     string Rs_TechniqueMode = "morelights";
  1092.     string Rs_TechniqueOpacity = "opaque";
  1093.     string Rs_TechniqueQuality = "35";
  1094. >
  1095. {
  1096.     pass D3_FALLBACK_PASS_02
  1097.     {
  1098.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(false, false);
  1099.         PixelShader = NULL;
  1100.  
  1101.         AlphaBlendEnable = true;
  1102.  
  1103.         SrcBlend = ONE;
  1104.         DestBlend = ONE;
  1105.  
  1106.         ZEnable = true;
  1107.         ZFunc = LESSEQUAL;
  1108.         ZWriteEnable = false;
  1109.         
  1110.         // Set texture filtering.
  1111.         MinFilter[0] = Linear;
  1112.         MagFilter[0] = Linear;
  1113.         MipFilter[0] = Point;
  1114.  
  1115.         // Set texture into stage 0.
  1116.         Texture[0]   = (RsFALL_DiffuseMap);
  1117.  
  1118.         SpecularEnable = true;
  1119.         ColorVertex = true;        
  1120.  
  1121.         Lighting = false;
  1122.         ShadeMode = GOURAUD;
  1123.  
  1124.         CullMode = CCW;
  1125.     }
  1126. }
  1127.  
  1128. technique D3_FALLBACK_TECHNIQUE_DX7_NOMADD_T
  1129. <
  1130.     string Rs_TechniqueMode = "firstlight";
  1131.     string Rs_TechniqueOpacity = "transparent";
  1132.     string Rs_TechniqueQuality = "35";
  1133. >
  1134. {
  1135.     pass D3_FALLBACK_PASS_02
  1136.     {
  1137.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(true, true);
  1138.         PixelShader = NULL;
  1139.  
  1140.         AlphaBlendEnable = true;
  1141.         SrcBlend = SRCALPHA;
  1142.         DestBlend = INVSRCALPHA;
  1143.  
  1144.         ZEnable = true;
  1145.         ZFunc = LESSEQUAL;
  1146.         ZWriteEnable = false;
  1147.         
  1148.         // Set texture filtering.
  1149.         MinFilter[0] = Linear;
  1150.         MagFilter[0] = Linear;
  1151.         MipFilter[0] = Point;
  1152.  
  1153.         // Set texture into stage 0.
  1154.         Texture[0]   = (RsFALL_DiffuseMap);
  1155.  
  1156.         SpecularEnable = true;
  1157.         ColorVertex = true;        
  1158.  
  1159.         Lighting = false;
  1160.         ShadeMode = GOURAUD;
  1161.  
  1162.         CullMode = CCW;
  1163.     }
  1164. }
  1165.  
  1166. technique D3_FALLBACK_TECHNIQUE_DX7_NOMADD_MORELIGHTS_T
  1167. <
  1168.     string Rs_TechniqueMode = "morelights";
  1169.     string Rs_TechniqueOpacity = "transparent";
  1170.     string Rs_TechniqueQuality = "35";
  1171. >
  1172. {
  1173.     pass D3_FALLBACK_PASS_02
  1174.     {
  1175.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7(true, false);
  1176.         PixelShader = NULL;
  1177.  
  1178.         AlphaBlendEnable = true;
  1179.         SrcBlend = SRCALPHA;
  1180.         DestBlend = ONE;
  1181.  
  1182.         ZEnable = true;
  1183.         ZFunc = LESSEQUAL;
  1184.         ZWriteEnable = false;
  1185.         
  1186.         // Set texture filtering.
  1187.         MinFilter[0] = Linear;
  1188.         MagFilter[0] = Linear;
  1189.         MipFilter[0] = Point;
  1190.  
  1191.         // Set texture into stage 0.
  1192.         Texture[0]   = (RsFALL_DiffuseMap);
  1193.  
  1194.         SpecularEnable = true;
  1195.         ColorVertex = true;        
  1196.  
  1197.         Lighting = false;
  1198.         ShadeMode = GOURAUD;
  1199.  
  1200.         CullMode = CCW;
  1201.     }
  1202. }
  1203.  
  1204. struct VS_OUTPUT_SIMPLE_DX7_NOTEX {
  1205.     float4 vClipPos: POSITION;      //Clipping space position
  1206.     float4 cColor0 : COLOR0;        //diffuse map mod
  1207. };
  1208.  
  1209. VS_OUTPUT_SIMPLE_DX7_NOTEX VS_Fallback_Simple_DX7NOTEX(uniform bool EnableAlpha, uniform bool IsFirstPass, in D3_VERTEXINPUT input) 
  1210. {
  1211.     VS_OUTPUT_SIMPLE_DX7_NOTEX output;
  1212.  
  1213.     //Following code outputs position and texture coordinates
  1214.     //------------------------------
  1215.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  1216.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  1217.  
  1218.     //Compute light and eye vectors
  1219.     //------------------------------
  1220.     float3 vToLight = RsFALL_LightPos.xyz - pVertexWorld.xyz;
  1221.     float  fRealDistToLight = length(vToLight);
  1222.     vToLight = normalize(vToLight);
  1223.  
  1224.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  1225.  
  1226.     float4 output_cLightColor = RsD3DComputeLightColor(fRealDistToLight);
  1227.  
  1228.     //Compute final per vertex color using light/specular/diffuse
  1229.     //------------------------------
  1230.     float3 vNormal = normalize(mul(input.D3_vInputNormal * RsD3DMaterialFromME_fNormalMod, D3_mObjectToWorldN));
  1231.     float3 vRefVec = dot(vToLight, vNormal) * 2 * vNormal - vToLight;
  1232.     float fEyeDotRef = max(0, dot(vRefVec, vToEye));
  1233.  
  1234.     float4 output_cSpecularCol = RsFALL_SpecularColor * pow(fEyeDotRef, RsFALL_Shininess) * RsFALL_SpecularStrength;
  1235.     float4 output_cVertexColor = input.D3_cInputColor * RsFALL_VertexColorStrength + RsFALL_DiffuseColor;
  1236.  
  1237.     float fDiffuseDot = saturate(dot(vNormal, vToLight)) * RsFALL_DiffuseStrength;
  1238.     float4 vOutFinal0 = saturate(output_cLightColor * RsFALL_DiffuseMapStrength * fDiffuseDot);
  1239.  
  1240.     float4 vOutFinal1 = saturate(output_cLightColor * (output_cSpecularCol + (output_cVertexColor * fDiffuseDot)));
  1241.     output.cColor0 = vOutFinal0 + vOutFinal1;
  1242.     if (EnableAlpha)
  1243.         output.cColor0.a = RsD3DMaterialFromME_fOpacity;
  1244.  
  1245.     ///Add the overlay color
  1246.     if (IsFirstPass)
  1247.     {
  1248.         ///First pass performs complete blending.
  1249.         output.cColor0.xyz = RsD3DMaterialFromME_cOverlayMod.xyz + RsD3DMaterialFromME_cOverlayMod.a * output.cColor0.xyz;
  1250.     }
  1251.     else
  1252.     {
  1253.         ///All other passes just attenuate the lighting accordingly.
  1254.         output.cColor0.xyz = RsD3DMaterialFromME_cOverlayMod.a * output.cColor0.xyz;
  1255.     }
  1256.  
  1257.     return output;
  1258. }
  1259.  
  1260. //DX7 technique for HW without textures - all per vertex
  1261. technique D3_FALLBACK_TECHNIQUE_DX7
  1262. <
  1263.     string Rs_TechniqueMode = "firstlight";
  1264.     string Rs_TechniqueOpacity = "opaque";
  1265.     string Rs_TechniqueQuality = "15";
  1266. >
  1267. {
  1268.     pass D3_FALLBACK_PASS_02
  1269.     {
  1270.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7NOTEX(false, true);
  1271.         PixelShader = NULL;
  1272.  
  1273.         AlphaBlendEnable = false;
  1274.  
  1275.         ZEnable = true;
  1276.         ZFunc = LESSEQUAL;
  1277.         ZWriteEnable = true;
  1278.         
  1279.         Lighting = false;
  1280.         ShadeMode = GOURAUD;
  1281.  
  1282.         CullMode = CCW;
  1283.     }
  1284. }
  1285.  
  1286. technique D3_FALLBACK_TECHNIQUE_DX7_MORELIGHTS
  1287. <
  1288.     string Rs_TechniqueMode = "morelights";
  1289.     string Rs_TechniqueOpacity = "opaque";
  1290.     string Rs_TechniqueQuality = "15";
  1291. >
  1292. {
  1293.     pass D3_FALLBACK_PASS_02
  1294.     {
  1295.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7NOTEX(false, false);
  1296.         PixelShader = NULL;
  1297.  
  1298.         AlphaBlendEnable = true;
  1299.  
  1300.         SrcBlend = ONE;
  1301.         DestBlend = ONE;
  1302.  
  1303.         ZEnable = true;
  1304.         ZFunc = LESSEQUAL;
  1305.         ZWriteEnable = false;
  1306.         
  1307.         Lighting = false;
  1308.         ShadeMode = GOURAUD;
  1309.  
  1310.         CullMode = CCW;
  1311.     }
  1312. }
  1313.  
  1314. technique D3_FALLBACK_TECHNIQUE_DX7_T
  1315. <
  1316.     string Rs_TechniqueMode = "firstlight";
  1317.     string Rs_TechniqueOpacity = "transparent";
  1318.     string Rs_TechniqueQuality = "15";
  1319. >
  1320. {
  1321.     pass D3_FALLBACK_PASS_02
  1322.     {
  1323.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7NOTEX(true, true);
  1324.         PixelShader = NULL;
  1325.  
  1326.         AlphaBlendEnable = true;
  1327.         SrcBlend = SRCALPHA;
  1328.         DestBlend = INVSRCALPHA;
  1329.  
  1330.         ZEnable = true;
  1331.         ZFunc = LESSEQUAL;
  1332.         ZWriteEnable = false;
  1333.         
  1334.         Lighting = false;
  1335.         ShadeMode = GOURAUD;
  1336.  
  1337.         CullMode = CCW;
  1338.     }
  1339. }
  1340.  
  1341. technique D3_FALLBACK_TECHNIQUE_DX7_MORELIGHTS_T
  1342. <
  1343.     string Rs_TechniqueMode = "morelights";
  1344.     string Rs_TechniqueOpacity = "transparent";
  1345.     string Rs_TechniqueQuality = "15";
  1346. >
  1347. {
  1348.     pass D3_FALLBACK_PASS_02
  1349.     {
  1350.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7NOTEX(true, false);
  1351.         PixelShader = NULL;
  1352.  
  1353.         AlphaBlendEnable = true;
  1354.         SrcBlend = SRCALPHA;
  1355.         DestBlend = ONE;
  1356.  
  1357.         ZEnable = true;
  1358.         ZFunc = LESSEQUAL;
  1359.         ZWriteEnable = false;
  1360.         
  1361.         Lighting = false;
  1362.         ShadeMode = GOURAUD;
  1363.  
  1364.         CullMode = CCW;
  1365.     }
  1366. }
  1367.  
  1368. //------------------------------
  1369. // This is a fallback code for absolutely weird hardware
  1370. // No texture, just vertex colors
  1371. //------------------------------
  1372. struct VS_OUTPUT_SIMPLE {
  1373.     float4 vClipPos: POSITION;  //Clipping space position
  1374.     float4 cColor  : COLOR;     //vertex color
  1375. };
  1376.  
  1377. VS_OUTPUT_SIMPLE VS_Fallback_Simple(uniform bool IsFirstPass, float4 vPosition : POSITION, float3 vNormal : NORMAL, float4 cColor : COLOR) 
  1378. {
  1379.     VS_OUTPUT_SIMPLE output;
  1380.  
  1381.     output.vClipPos = mul(vPosition, D3_mObjectToClip);         //vertex clip position
  1382.     float4 pVertexWorld = mul(vPosition, D3_mObjectToWorld);    //Transform vertex into world position
  1383.  
  1384.     float3 vLight = normalize(D3_pEye - pVertexWorld);
  1385.     vNormal = normalize(mul(vNormal, D3_mObjectToWorldN));
  1386.  
  1387.     float Diffuse = saturate(dot(vNormal, vLight)) * RsFALL_DiffuseStrength;
  1388.     output.cColor = cColor * Diffuse;
  1389.     ///Add the overlay color
  1390.     if (IsFirstPass)
  1391.     {
  1392.         ///First pass performs complete blending.
  1393.         output.cColor.xyz = RsD3DMaterialFromME_cOverlayMod.xyz + RsD3DMaterialFromME_cOverlayMod.a * output.cColor.xyz;
  1394.     }
  1395.     else
  1396.     {
  1397.         ///All other passes just attenuate the lighting accordingly.
  1398.         output.cColor.xyz = RsD3DMaterialFromME_cOverlayMod.a * output.cColor.xyz;
  1399.     }
  1400.     return output;
  1401. }
  1402.  
  1403. technique D3_FALLBACK_TECHNIQUE
  1404. <
  1405.     string Rs_TechniqueMode = "firstlight";
  1406.     string Rs_TechniqueOpacity = "opaque";
  1407.     string Rs_TechniqueQuality = "0";
  1408. >
  1409. {
  1410.     pass D3_FALLBACK_PASS_02
  1411.     {
  1412.         VertexShader = compile vs_1_1 VS_Fallback_Simple(true);
  1413.         PixelShader = NULL;
  1414.  
  1415.         AlphaBlendEnable = false;
  1416.  
  1417.         ZEnable = true;
  1418.         ZFunc = LESSEQUAL;
  1419.         ZWriteEnable = true;
  1420.  
  1421.         Lighting = false;
  1422.         ShadeMode = GOURAUD;
  1423.  
  1424.         CullMode = CCW;
  1425.     }
  1426. }
  1427.  
  1428. technique D3_FALLBACK_TECHNIQUE_MORELIGHT
  1429. <
  1430.     string Rs_TechniqueMode = "morelights";
  1431.     string Rs_TechniqueOpacity = "opaque";
  1432.     string Rs_TechniqueQuality = "0";
  1433. >
  1434. {
  1435.     pass D3_FALLBACK_PASS_02
  1436.     {
  1437.         VertexShader = compile vs_1_1 VS_Fallback_Simple(false);
  1438.         PixelShader = NULL;
  1439.  
  1440.         AlphaBlendEnable = false;
  1441.  
  1442.         ZEnable = true;
  1443.         ZFunc = NEVER;
  1444.         ZWriteEnable = false;
  1445.  
  1446.         Lighting = false;
  1447.         ShadeMode = GOURAUD;
  1448.  
  1449.         CullMode = CCW;
  1450.     }
  1451. }
  1452.  
  1453. technique D3_FALLBACK_TECHNIQUE_T
  1454. <
  1455.     string Rs_TechniqueMode = "firstlight";
  1456.     string Rs_TechniqueOpacity = "transparent";
  1457.     string Rs_TechniqueQuality = "0";
  1458. >
  1459. {
  1460.     pass D3_FALLBACK_PASS_02
  1461.     {
  1462.         VertexShader = compile vs_1_1 VS_Fallback_Simple(true);
  1463.         PixelShader = NULL;
  1464.  
  1465.         AlphaBlendEnable = false;
  1466.  
  1467.         ZEnable = true;
  1468.         ZFunc = LESSEQUAL;
  1469.         ZWriteEnable = false;
  1470.  
  1471.         Lighting = false;
  1472.         ShadeMode = GOURAUD;
  1473.  
  1474.         CullMode = CCW;
  1475.     }
  1476. }
  1477.  
  1478. technique D3_FALLBACK_TECHNIQUE_MORELIGHT_T
  1479. <
  1480.     string Rs_TechniqueMode = "morelights";
  1481.     string Rs_TechniqueOpacity = "transparent";
  1482.     string Rs_TechniqueQuality = "0";
  1483. >
  1484. {
  1485.     pass D3_FALLBACK_PASS_02
  1486.     {
  1487.         VertexShader = compile vs_1_1 VS_Fallback_Simple(false);
  1488.         PixelShader = NULL;
  1489.  
  1490.         AlphaBlendEnable = false;
  1491.  
  1492.         ZEnable = true;
  1493.         ZFunc = NEVER;
  1494.         ZWriteEnable = false;
  1495.  
  1496.         Lighting = false;
  1497.         ShadeMode = GOURAUD;
  1498.  
  1499.         CullMode = CCW;
  1500.     }
  1501. }
  1502.  
  1503.  
  1504.